title: 32.Unix 50 年:Ken Thompson 的密码 outline: deep

50年前,除了Apollo上天之外,还有一个大事的发生,就是Unix操作系统的诞生,若干年前我写过《Unix的传奇,上篇下篇》,Unix是我入行前十年伴我成长的操作系统,虽然现在Linux早已接过了Unix的时代交接棒,但是,Unix文化对我个人的技术观影响是非常大的(注:《Unix编程艺术》是一本对影响我很深的书),而对于 Ken Thompson 和 Dennis Ritchie 这两位 Unix 的缔造者,也是计算机圈中的神一般的人物。今天,Dennis已经去逝,Ken在Google里跟 Rob Pike和 Robert Griesemer 这两位大神在开发Go语言。

P.S. 今年,我一直想写篇Unix 50周年纪念的文章,但一直无从下手,因为不想写过大的命题,如果能写个轶事最好不过。正好过完国庆节,技术圈里有个“热搜”——Ken Thompson的密码。但一直没有时间,所以拖到今天才写下来。

正文开始,2014年,有个叫Leah Neukirchen的程序员(blog)在 BSD 3 的源代码中的 [/etc/passwd](https://leahneukirchen.org/blog/archive/2019/10/ken-thompson-s-unix-password.html) 看到了早年Unix黑客们的被 hash了的密码,该文件如下所示:

root:OVCPatZ8RFmFY:0:10:Ernie Co-vax,4156427925:/: daemon:*:1:1:The devil himself:/: bill:.2xvLVqGHJm8M:8:10:& Joy,4156424948:/usr/bill:/bin/csh ozalp:m5syt3.lB5LAE:40:10:& Babaoglu,4156423806:/usr/ozalp:/bin/csh sklower:8PYh/dUBQT9Ss:2:10:Keith &,4156424972:/usr/staff/sklower:/bin/csh kridle:4BkcEieEtjWXI:3:10:Bob &,4156426744:/usr/staff/kridle:/bin/csh kurt:olqH1vDqH38aw:4:10:& Shoens,4156420572:/usr/staff/kurt:/bin/csh schmidt:FH83PFo4z55cU:7:10:Eric &,4156424951:/usr/staff/schmidt:/bin/csh hpk:9ycwM8mmmcp4Q:9:10:Howard Katseff,2019495337:/usr/staff/hpk:/bin/csh tbl:cBWEbG59spEmM:10:10:Tom London,2019492006:/usr/staff/tbl: jfr:X.ZNnZrciWauE:11:10:John Reiser:/usr/staff/jfr: mark:Pb1AmSpsVPG0Y:12:10:& Horton,4156428311:/usr/staff/mark:/bin/csh dmr:gfVwhuAMF0Trw:42:10:Dennis Ritchie:/usr/staff/dmr: ken:ZghOT0eRm4U9s:52:10:& Thompson:/usr/staff/ken: sif:IIVxQSvq1V9R2:53:10:Stuart Feldman:/usr/staff/sif: scj:IL2bmGECQJgbk:60:10:Steve Johnson:/usr/staff/scj: pjw:N33.MCNcTh5Qw:61:10:Peter J. Weinberger,2015827214:/usr/staff/pjw:/bin/csh bwk:ymVglQZjbWYDE:62:10:Brian W. Kernighan,2015826021:/usr/staff/bwk: uucp:P0CHBwE/mB51k:66:10:UNIX-to-UNIX Copy:/usr/spool/uucp:/usr/lib/uucp/uucico srb:c8UdIntIZCUIA:68:10:Steve Bourne,2015825829:/usr/staff/srb: finger::199:199:The & Program:/usr/ucb:/usr/ucb/finger who::199:199:The & Program:/usr/ucb:/bin/who w::199:199:The & Program:/usr/ucb:/usr/ucb/w mckusick:AAZk9Aj5/Ue0E:201:10:Kirk &,4156424948:/usr/staff/mckusick:/bin/csh peter:Nc3IkFJyW2u7E:202:10:& Kessler,4156424948:/usr/staff/peter:/bin/csh henry:lj1vXnxTAPnDc:203:10:Robert &,4156424948:/usr/staff/henry:/bin/csh jkf:9ULn5cWTc0b9E:209:10:John Foderaro,4156424972:/usr/staff/jkf:/bin/csh fateman:E9i8fWghn1p/I:300:10:Richard &,4156421879:/usr/staff/fateman:/bin/csh fabry:d9B17PTU2RTlM:305:10:Bob &,4156422714:/usr/staff/fabry:/bin/csh network:9EZLtSYjeEABE:501:50:*:/usr/net/network:/usr/net/network/nsh tty::504:50::/:/bin/tty我

(注,以前Unix是一个服务器,所有人都用一个终端到服务器上进行操作,于是,这个服务上的 /etc/passwd 下保存着所有的人的登录密码,能让所有的人都能读到,为了不让别人猜到,这个文件中的密码保存(第二列)被做过哈希处理)

这位程序员一看,这些个用户不就是Dennis Ritchie, Ken Thompson, Brian W. Kernighan, Steve Bourne, Bill Joy 这些神人的密码吗?!于是,他想看看这些人用什么样的密码。考虑到当时的加密算法用的是基于DES的 crypt(3) 算法(这个算法今天还在用,像Perl/PHP/Python/Ruby都提供crypt() 函数),而且当时的密码最长只支持8个长度,所以,感觉还是很容易暴力破解的。

一般来说,暴力破解的这种hash密码的工具主要是用hashcatjohn ,很快,Leah 破解了大多数人的密码,因为大多数都使用的是比较弱的密码,比如: Brian W. Kernighanbwk)使用了 /.,/., 这样的密码,而 Dennis Ritchiedmr)则使用了 dmac 这样的密码。然后,在破解到 Ken Thompson的密码时,搞不定了,花了好几天穷举完了所有的小写字母+数字都没有找到。

因为这个crypt的算法也是Ken Thompson 和 Robert Morris 写的,他们在40年前就发现,原来的hash算法太快了,这样很容易被暴力穷举,于是在第七版的Unix(1979年发布),他们把算法改成DES的算法,就是要让这个算法变慢。详细地说,用户密码被截断为八个字符,每个字符仅被压缩为7位。这形成56位DES密钥。然后,该密钥用于加密全零位块,然后再次使用相同的密钥对密文进行加密,依此类推,总共进行了25次DES加密。感觉跟区块链的“挖矿”有点像。在最早的Unix计算机上,这个算法需要花了整整一秒钟的时间来计算密码哈希

这几十年来,计算机的计算速度根据摩尔定律至少double了20次,所以,DES算法已经很容被攻击了,然而,对于Ken Thompson的密码,在2014年还是很不容易被破解的,因为,如果要加上所有的大小写字符数字和其它特殊字符,那么,在2014年,就算用最快的GPU来穷举所有的8位长度的密码,也需要花上至少2年以上的时间

在2019年10月份,在 The Unix Heritage Society 这个社区中,这个事又被人问起来,说以前有个人破解这些密码,不知道有没有全破解出来了?于是Leah看到了,就回应说,那个人是我,但是还是没干出来……于是好些人进来留言。

5天后,2019年10月08日,一个来自澳大利亚的程序员Nigel Williams说,Ken的密码我破解出来了,哈希串ZghOT0eRm4U9s 明文是 p/q2-q4!(果然是有数字有特殊字符),小伙说,我在 AMD Radeon Vega 64 的 GPU上运行了 hashcat 这个命令,干了我 4天多,每秒钟的“配速”是930MH/s (每秒钟9亿3千万次hash运算)。然后,Ken Thompson 也留言到 “恭喜” ,这样,Ken 的密码在40年后被破解了……

马上,就有人问到,这个密码是不是国际象棋的走棋?嗯,很像中国象棋中的“车五进一”,“马三退一”,这个密码中的 p 代表 pawn 小兵,从 q2 的位置走到 q4,这个看来是国际象棋中的开局进兵——用来做登录密码,非常合适。而且,Ken Thompson 在 Unix中写下的一个国际象棋的程序 Belle,在1978年首次参加计算机协会的北美计算机国际象棋锦标赛时,它获得了第一个冠军头衔,其搜索深度为八层。之后又赢得了四次冠军。1983年,它也成为第一台获得国际象棋“大师”称号的计算机。所以,Ken用这个做密码相当make sense!

Ken在贝尔实验室调程序(图片来源:IEEE SPECTRUM

当然,还有一个人的密码是所有人里最难破解的,这个人就是Bill Joy,他最初作为加州大学伯克利分校的研究生,在校期间着手改进Unix 内核,并管理BSD发行版。他最著名的贡献是ex和vi编辑器以及C shell。在Sun公司成立6个月后,他正式成为公司的联合创始人,他在Sun公司的推动了NFS,SPARC处理器,以及Java语言。他还是一个风险投资人员。

在Ken的密被破解后两周(2019年10月19日),有人号称已经破解了Bill的密码,他在邮件组中这样写到

› 一开始,我使用了大小写字符和数字,8位长度来破解所有的组合,花了我6天的时间,失败了。然后,我开始尝试只用小写字母和控制字符,结果在40分钟内就破解了。但是因为Bill现健在,所以,只要bill同意他才公布这个密码。

在密码里存控制字符?这脑洞,Ctrl+C么?破解者还说,他在一个有三个结点的DELL 的HPC集群上完成这个工作,每个结点包括两个 Tesla V100 nVidia GPU 的显卡,一共30720个CUDA核…… 关于这个显卡多少钱,你可以上网搜吧…… 相当于一块劳力士吧……(我估计这组机器平时是用来挖矿的……[狗头])

好了,我们来看一下这个 /etc/passwd 中的这些人的密码是什么样的,但最主要的是向这些为人类做过巨大贡献的程序员科学家们致敬

最后,再首尾呼应一下,在我的技术生涯中,Unix文化对我个人的技术观影响是非常大的,我个人认为 Unix 就像摇滚乐一样,上世纪60年代-80年代,是整个人类最经典最光亮的时代,值得我们每个人向那个时代的人和事致敬!

————————————————————————

P.S.

你可以浏览 Github 的 unix-history-repo 目录(注:本文给的这个链接不在master分支上),这个repo是40年前的代码,涵盖了从1970年创建时的2.5万行内核和26条命令到2017年为止广泛使用的2700万行系统。1.1GB的存储库包含大约一百万次提交和两千多次合并。通过这个链接你可以了解一下这个代码的历史!

下载这些代码需要你的1.5GB的硬盘空间,你可以查看各个大神写的代码,包括 Ken Thompson 和 Dennis的,以及相关的注释。

根据这些,你还可以找到 Ken Thompson的 Github账号 https://github.com/ken 以及别人为dmr建的github帐号 https://github.com/dmr-1941-2011

P.S.S

下面是一些和Unix相关的维基百科资料

还有Unix的社区:TUHS: The Unix Heritage Society – The Unix Tree